/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao.modelos;
import java.util.ArrayList;
import entidades.Reserva;
import javax.swing.table.AbstractTableModel;
import entidades.Voo;
import telas.TelaGerenciaReserva;
import javax.swing.JOptionPane;
import controladoras.apresentacao.CntrIntReserva;

/**
 * Classe modela a tabela gerencia reserva.
 * @author daniel
 * @author lucas
 * @author thiagostuckert
 */
public class ModeloGerenciaReserva extends AbstractTableModel {
    /**
     * Referencia para a classe ModeloGerenciaReserva.
     */
    private static ModeloGerenciaReserva ref;
    /**
     * Recupera a referencia para a classe caso ela exista caso contrário
     * cria um objeto.
     * @return Objeto para a classe.
     */
    public static ModeloGerenciaReserva  instanciar() {
        if (ref == null) {
            ref = new ModeloGerenciaReserva();
        }
        return ref;
    }

    /**
     * Nome das colunas da tabela.
     */
    private String[] columnNames = {"CodReserva", "NroVoo 1", "NroVoo 2",
        "NroVoo 3", "NroVoo 4", "NroVoo 5"};

    /**
     * Linhas da tabela.
     */
    private ArrayList<Reserva> rows = new ArrayList();

    /**
     * Seta as linhas da tabela.
     * @param linhas Novo valor para as linhas.
     */
    public final void setRows(final ArrayList linhas) {
        rows = linhas;
    }
    /**
     * Recupera a quantidade de colunas da tabela.
     * @return Quantidade de colunas da tabela.
     */
    @Override
    public final int getColumnCount() {
        return columnNames.length;
    }
    /**
     * Recupera a quantidade de linhas da tabela.
     * @return Quantidade de linhas da tabela.
     */
    @Override
    public final int getRowCount() {
        return rows.size();
    }
    /**
     * Recupera o nome da coluna col.
     * @param col indice da coluna.
     * @return Nome da coluna.
     */
    @Override
    public final String getColumnName(final int col) {
        return columnNames[col];
    }
    /**
     *  Recupera o valor da linha rowIndes e coluna columnIndex.
     * @param rowIndex Indice da linha.
     * @param columnIndex Indice da coluna.
     * @return objeto da da tabela[rowIndex][columnIndex].
     */
    @Override
    public final Object getValueAt(final int rowIndex, final int columnIndex) {
        Reserva reserva = rows.get(rowIndex);
        if (columnIndex == 0) {
            return reserva.getReserva();
        } else {
            Voo voo = reserva.getReservaVoo(columnIndex - 1);
            if (voo == null) {
                 return "";
            } else {
                return voo.getNumeroVoo();
            }
        }
    }

     /**
      * Determina quais celulas serão editáveis.
      * @param row linha da tabela.
      * @param col coluna da tabela.
      * @return boolean true se for editável ou false caso contrário.
      */
    @Override
    public final boolean isCellEditable(final int row, final int col) {
        if (col == 0) {
            return false;
        } else {
            return true;
        }
    }
    /**
     * Adiciona linha na tabela.
     * @param reserva Objeto a ser adicionado na tabela.
     */
    public final void addRow(final Reserva reserva) {
        rows.add(reserva);
        int linha = rows.size() - 1;
        fireTableRowsInserted(linha, linha);
        return;
    }

    /**
     * Deleta uma linha da tabela.
     * @param row linha a ser deletada da tabela.
     */
    public final void delRow(final int row) {
        rows.remove(row);
        fireTableRowsDeleted(row, row);
    }
    /**
     * Seta o valor da tabela[row][col].
     * @param value valor novo da célula.
     * @param row linha da tabela.
     * @param col coluna da tabela.
     */
    @Override
    public final void setValueAt(final Object value, final int row,
            final int col) {
        /*Devo decrementar a coluna por conta da coluna com cod Reserva*/

        Reserva reservaNova = rows.get(row);
        Reserva reservaVelha = new Reserva(reservaNova.getReserva());

        for (int i = 0; i < reservaNova.getNroVoosReserva(); i++) {
            Voo vooNovo = reservaNova.getReservaVoo(i);
            Voo vooVelho = new Voo(vooNovo.getNumeroVoo());
            reservaVelha.adicionaVoo(vooVelho);
        }

        try {
            Voo voo = reservaNova.getReservaVoo(col - 1);
            voo.setNumeroVoo((String) value);
            CntrIntReserva cntrIntReserva = CntrIntReserva.instanciar();
            cntrIntReserva.upReserva(reservaVelha, reservaNova);
        } catch (Exception e) {
             TelaGerenciaReserva telaGerenciaReserva =
                     TelaGerenciaReserva.instanciar();
             JOptionPane.showMessageDialog(telaGerenciaReserva,
                     e.getMessage());

             rows.set(row, reservaVelha);
         }
         fireTableCellUpdated(row, col - 1);
    }
}